#include <array>
#include <vector>

//#include <QMessageBox>
#include<debugx>
#include <iostream>
#include <memory>

using namespace std;

namespace boostDemo
{
void main();
}
namespace type_traits
{
void main();
}
namespace ThreadDemo
{
void main();
}
namespace moveDemo
{
//void main();
}
namespace baseDemo
{
int main();
}
namespace friendDemo
{
int main();
}

namespace friendDemo1
{
int main();
}

class MyDemo {
public:
    int index(){ static int inde=0; return inde++;}
    int i=index();
    int j=0;
    MyDemo() {
        dinfo("construction called  i=%d ",i);
    }
    ~MyDemo() { dinfo("release i=%d, j=%d ",i,j); }


};
void smartDemo ()
{
    // 构建一个shared_ptr
    auto sp = make_shared<int>(42);

    cout << "sp  is " << *(sp.get()) << endl;

    cout << "sp use count is " << sp.use_count() << endl;

    // 方式1 通过构造函数初始化
    weak_ptr<int> wp1(sp);
    cout << "构造函数初始化 sp use count is " << sp.use_count() << endl;

    // 方式2 通过拷贝构造函数来初始化
    weak_ptr<int> wp2(wp1);
    cout << "拷贝构造函数来初始化 sp use count is " << sp.use_count() << endl;

    // 方式3 通过weak_ptr来赋值初始化
    weak_ptr<int> wp3;
    wp2 = wp1;
    cout << "weak_ptr来赋值初始化 sp use count is " << sp.use_count() << endl;

    // weak_ptr 访问对象的方式举例
    if (!wp2.expired())
    {
        if (auto np2 = wp2.lock())
        {
            cout << "-----np2 point to value is " << *np2 << endl;
        }
    }

    sp.reset();
    if (wp2.expired())
    {
        cout << "obj has been dectruct." << endl;
    }
    else
    {
        if (auto np2 = wp2.lock())
        {
            cout << "====np2 point to value is " << *np2 << endl;
        }
    }


    auto a=make_shared<int>();

    shared_ptr<string> p1 = make_shared<string>(10, '9');
    shared_ptr<string> p2 = make_shared<string>("hello");
    shared_ptr<string> p3 = make_shared<string>();// 指向空string
   auto v1= p1.get();
    cout<<*v1<<endl;
    cout<<*p1<<endl;
    cout<<*p2<<endl;
    cout<<*p3<<endl;

    shared_ptr<list<int>> p4; // 指向int的list

    /*
make_shared（比起直接使用new）的一个特性是能提升效率。使用make_shared允许编译器产生更小，更快的代码，
产生的代码使用更简洁的数据结构。考虑下面直接使用new的代码：

shared_ptr<Widget> spw(new Widget);



很明显这段代码需要分配内存，但是它实际上要分配两次。每个shared_ptr都指向一个控制块，控制块包含被指向对象的引用计数以及其他东西。
这个控制块的内存是在shared_ptr的构造函数中分配的。因此直接使用new，需要一块内存分配给Widget，还要一块内存分配给控制块。

如果使用make_shared来替换

auto spw = make_shared<Widget>();



一次分配就足够了。这是因为make_shared申请一个单独的内存块来同时存放Widget对象和控制块。
这个优化减少了程序的静态大小，因为代码只包含一次内存分配的调用，并且这会加快代码的执行速度，因为内存只分配了一次。
另外，使用make_shared消除了一些控制块需要记录的信息，这样潜在地减少了程序的总内存占用。

*/
    shared_ptr<MyDemo> spw2(new MyDemo);//  分配2次内存?
    auto spw1 = make_shared<MyDemo>(); //只分配1次内存
}


namespace mainDemo {


int main() {



 //   void float128Demo();
//    float128Demo();
    smartDemo ();
//    void streamBufDemo();
//    streamBufDemo();

 //   void byteBufferDemo();
//    byteBufferDemo();
 //   void strBufDemo();
 //   strBufDemo();
 //   friendDemo1::main();
//friendDemo::main();
  //      ThreadDemo::main();
 //   baseDemo::main();
 // moveDemo::main();
//  boostDemo::main();
//  type_traits::main();




  return 0;
}
}
